#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
-------------------------------------------------
   File Name：    file.py
   Remark :  文件处理的相关工具包
-------------------------------------------------
"""
# 导入__future__模块以启用特定于Python 2和3之间的兼容性特性
from __future__ import annotations

import os
import glob
import hashlib
from pathlib import Path

from apitesting.common.db.redis_handler import redis_handler as redis_client
# from apitesting.enums import CaseDataType
from apitesting.src import enums
from apitesting.common.file.json_handler import json_handler as read_json_file
from apitesting.common.file.yaml_handler import yaml_handler
from apitesting.config import paths
from apitesting.config import settings

# __all__ = ["File"]


class FileHandler:

    @staticmethod
    def get_all_testdata_filepaths(filepath: str | None = None) -> list[str]:
        """
        搜索指定项目目录下（包括子目录）所有测试用例数据文件

        :param filepath:
        :return:
        """

        if filepath is None:
            case_data_filepath = os.path.join(
                paths.test_data_dir,
                f"{settings.project.name}"
            )
        else:
            case_data_filepath = filepath

        # print(case_data_filepath)
        files = (
                glob.glob(os.path.join(case_data_filepath, '**', '*.yaml'), recursive=True)
                + glob.glob(os.path.join(case_data_filepath, '**', '*.yml'), recursive=True)
                + glob.glob(os.path.join(case_data_filepath, '**', '*.json'), recursive=True)
        )
        return files

    @staticmethod
    def get_all_testcase_filepaths() -> list:
        """
        搜索指定项目目录下(包括子目录)所有测试用例文件

        :return:
        """
        files = glob.glob(
            os.path.join(paths.get_test_case_dir, f'{settings.project.name}', '**', 'test_*.py'), recursive=True
        )
        return files

    @staticmethod
    def get_file_property(filepath: str) -> tuple[str, str, str]:
        """
        获取文件的属性。
        :param filepath: 文件路径
        :return: 文件名、根文件名和文件类型
        文件名: 完整的文件名称，带后缀
        根文件名: 文件名称，不带后缀
        """
        # 获取文件的属性
        file = Path(filepath)
        if not file.exists():
            raise FileNotFoundError(f"File not found: {filepath}")

        # 获取文件名
        file_name = file.name
        # 获取根文件名
        file_root_name = file.stem
        # 获取文件类型
        file_type = file.suffix[1:]

        return file_name, file_root_name, file_type

    @staticmethod
    def read_file_from_type(file_path: str, file_type: str) -> dict:
        """
        根据文件类型读取并解析文件内容。

        :param file_path: 文件路径
        :param file_type: 文件类型 (JSON, YAML, YML)
        :return: 文件内容的字典
        """
        if file_type == enums.CaseDataFileType.JSON:
            return read_json_file(file_path)
        elif file_type in [enums.CaseDataFileType.YAML, enums.CaseDataFileType.YML]:
            return yaml_handler.read_yaml_file(file_path)
        else:
            raise ValueError("不支持的文件类型")

    @staticmethod
    def get_file_hash(filepath: str) -> str:
        """
        获取文件 hash (hash256) 值

        :param filepath:
        :return:
        """
        with open(filepath, 'rb') as f:
            contents = f.read()
            file_hash = hashlib.sha256(contents).hexdigest()
        return file_hash

    @staticmethod
    def get_case_data_from_redis(file_name: str, logging: bool = False) -> str | None:
        """
        从 Redis 中获取指定文件名的测试用例数据。
        :param file_name: 文件名
        :param logging: 是否记录日志
        :return: 测试用例数据字符串或 None
        """
        key = f'{redis_client.case_data_prefix}:{file_name}'
        data = redis_client.get(key, logging=logging)
        return data


File = FileHandler()

if __name__ == '__main__':
    # print(search_all_case_data_files())
    pass
